import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

import util.ByteUtil;
import util.FileUtil;
import disk.Directory;
import disk.DirectoryEntry;
import disk.Disk;
import disk.File;
import disk.Folder;

/**
 * 测试文件
 * 
 * @author vincent
 * 
 */
public class Test {

	public static void main(String[] args) throws IOException {
		Disk disk = Disk.getInstance();
		Directory root = disk.getRootDir(); // 根目录
		Directory currentDirectory = root; // 当前目录

		// 文件名和目录名都要3个字节

		// 先添加一些文件(测试用)
		root.addFile(new File("r_1".getBytes(), "tt".getBytes(), "this is r_1   2333333333333333333333333333333332333333333333333333333333333333333333333323333333333333333333333333333333333333333233333333333333333333333333333333333333332333333333333333333333333333333333333333323333333333333333333333333333333333333333233333333x".getBytes()));
		root.addFolder(new Folder("111".getBytes()));

		root.addFile("r_2.tt", "this is r_2");
		root.addFolder(new Folder("222".getBytes()));
		root.addFolder("333");
		root.addFile(new File("r_3".getBytes(), "tt".getBytes(), "this is r_3 223333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333333333333333333x".getBytes()));

		root.getSubDir("111").addFile(new File("1_1".getBytes(), "tt".getBytes(), "this is 1_1 2333333333333333333333333333333333333333333333333333333333333333333x".getBytes()));

		root.getSubDir("333").addFile(new File("3_1".getBytes(), "cc".getBytes(), "this is 3_1 2333".getBytes()));
		root.getSubDir("333").addFile("3_2.cc");

		root.getSubDir("222").addFile(new File("2_1".getBytes(), "cc".getBytes()));
		root.getSubDir("222").addFile(new File("2_2".getBytes(), "cc".getBytes(), "this is 2_2".getBytes()));

		root.addFolder("444");

		root.getSubDir("333").addFile(new File("3_3".getBytes(), "cc".getBytes(), "this is 3_3 ".getBytes()));
		root.getSubDir("333").addFile(new File("3_4".getBytes(), "cc".getBytes(), "22333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333323333333333333332333333333333333233333333333333333333333333333123x".getBytes()));

		root.getSubDir("222").addFile(new File("2_3".getBytes(), "cc".getBytes()));
		root.getSubDir("222").addFile(new File("2_4".getBytes(), "cc".getBytes(), "this is 2_4".getBytes()));

		root.getSubDir("111").addFile(new File("1_2".getBytes(), "tt".getBytes(), "this is 1_2 233333333333333333333333333333333333332333333333333333333333333333333333333333333333333333333333333333333x33333333333333333333333333333x".getBytes()));

		// 命令行界面
		Scanner scanner = new Scanner(System.in);
		while (true) {
			System.out.println("--------------------------------------");
			System.out.println("请选择:");
			System.out.println("1:新建文件      2:新建目录      3:进入子目录    4:进入任意目录");
			System.out.println("5:读取文件内容  6:修改文件内容  7:删除文件      8:删除目录");
			System.out.println("9:显示盘块内容  10:更换名字     11:返回上级目录");
			System.out.println("12:数据备份     13:数据恢复     14:退出程序");
			System.out.println("15:复制文件     16:移动文件");
			System.out.println("--------------------------------------");
			listFile(currentDirectory);
			int option = scanner.nextInt();

			switch (option) {
			// 新建文件
			case 1:
				System.out.println("请输入文件名:");
				String name = scanner.next();
				System.out.println("请输入类型名:");
				String typeName = scanner.next();
				System.out.println("请输入文件内容:");
				String content = scanner.next();
				currentDirectory.addFile(new File(name.getBytes(), typeName.getBytes(), content.getBytes()));
				break;
			// 新建目录
			case 2:
				System.out.println("请输入目录名:");
				currentDirectory.addFolder(new Folder(scanner.next().getBytes()));
				break;
			// 进入子目录
			case 3:
				System.out.println("请输入子目录名:");
				Directory tmpDirectory = currentDirectory.getSubDir(scanner.next());
				if (tmpDirectory != null) {
					currentDirectory = tmpDirectory;
				} else {
					System.out.println("文件夹不存在");
				}
				break;
			// 进入任意目录
			case 4:
				System.out.println("请输入目录名:");
				Directory tmpDirectory2 = Directory.getDirectory(scanner.next());
				if (tmpDirectory2 != null) {
					currentDirectory = tmpDirectory2;
				} else {
					System.out.println("文件夹不存在");
				}
				break;
			// 读取文件内容
			case 5:
				System.out.println("请输入文件名:");
				String name2 = scanner.next();
				System.out.println("请输入类型名:");
				String typeName2 = scanner.next();
				File file = currentDirectory.getFileInfo(name2 + "."
						+ typeName2);
				if (file != null)
					System.out.println(new String(file.getContent()));
				break;
			// 修改文件内容
			case 6:
				System.out.println("请输入文件名:");
				String name3 = scanner.next();
				System.out.println("请输入类型名:");
				String typeName3 = scanner.next();
				System.out.println("请输入新的文件内容:");
				String newContent = scanner.next();
				currentDirectory.updateFileContent(name3 + "." + typeName3, newContent);
				break;
			// 删除文件
			case 7:
				System.out.println("请输入文件名:");
				String name4 = scanner.next();
				System.out.println("请输入类型名:");
				String typeName4 = scanner.next();
				currentDirectory.deleteFile(name4 + "." + typeName4);
				break;
			// 删除文件夹
			case 8:
				System.out.println("请输入文件名:");
				String name5 = scanner.next();
				currentDirectory.deleteFolder(name5);
				break;
			// 显示盘块内容
			case 9:
				System.out.println("请输入要显示的起始盘块:");
				int start = scanner.nextInt();
				System.out.println("请输入要显示的结束盘块:");
				int end = scanner.nextInt();
				disk.print(start, end);
				break;
			// 更换名字
			case 10:
				System.out.println("请输入文件名:");
				String oldName = scanner.next();
				System.out.println("请输入新文件名:");
				String newName = scanner.next();
				currentDirectory.rename(oldName, newName);
				break;
			// 返回上级目录
			case 11:
				currentDirectory = currentDirectory.getParentDir();
				break;
			// 保存数据到本地
			case 12:
				disk.saveData();
				break;
			// 从本地文件加载数据到磁盘
			case 13:
				disk.loadDate();
				break;
			// 退出程序
			case 14:
				System.exit(0);
				break;
			// 复制文件
			case 15:
				System.out.println("请输入文件名:");
				String fileName = scanner.next();
				System.out.println("请输入新的路径:");
				String newPath = scanner.next();
				currentDirectory.copyFile(fileName, newPath);
				break;
			// 移动文件
			case 16:
				System.out.println("请输入文件或目录名:");
				String tmpDirEntryName = scanner.next();
				System.out.println("请输入新的路径:");
				String newPath2 = scanner.next();
				currentDirectory.move(tmpDirEntryName, newPath2);
				break;

			default:
				break;
			}

		}

		// unix命令行界面
		// Scanner scanner = new Scanner(System.in);
		// while (true) {
		// listFile(currentDirectory);
		// String cmd = scanner.nextLine();
		// String tokens[] = cmd.split(" ");
		// switch (tokens[0]) {
		// // 列出目录下的文件
		// case "ls":
		// listFile(currentDirectory);
		// break;
		// // 进入文件夹
		// case "cd":
		// if (tokens[1].equals("..")) {
		// currentDirectory = currentDirectory.getParentDir();
		// } else if (tokens[1].equals(".")) {
		// } else if (tokens[1].startsWith("/")) {
		// currentDirectory = Directory.getDirectory(tokens[1]);
		// } else {
		// Directory tmpdDirectory = currentDirectory.getSubDir(tokens[1]);
		// if (tmpdDirectory != null)
		// currentDirectory = tmpdDirectory;
		// }
		// break;
		// // 创建文件夹
		// case "mkdir":
		// currentDirectory.addFolder(tokens[1]);
		// break;
		// // 新建文件
		// case "touch":
		// currentDirectory.addFile(tokens[1]);
		// break;
		// // 修改文件内容
		// case "vim":
		// String[] nameTokens = FileUtil.parseFileName(tokens[1]);
		// currentDirectory.updateFileContent(nameTokens[0], nameTokens[1],
		// tokens[2]);
		// break;
		// // 读取文件内容
		// case "cat":
		// String[] tmp = tokens[1].split("\\.");
		// System.out.println(new String(currentDirectory.getFileInfo(tmp[0],
		// tmp[1]).getContent()));
		// break;
		// // 重命名
		// case "rename":
		// currentDirectory.rename(tokens[1], tokens[2]);
		// break;
		// // 删除文件
		// case "rm":
		// if (tokens[1].indexOf(".") != -1)
		// currentDirectory.deleteFile(tokens[1]);
		// else
		// currentDirectory.deleteFolder(tokens[1]);
		// break;
		// // 输出盘块内容
		// case "block":
		// disk.print(Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]));
		// break;
		// // 复制文件
		// case "cp":
		// currentDirectory.copyFile(tokens[1], tokens[2]);
		// break;
		// // 移动文件
		// case "mv":
		// currentDirectory.moveFile(tokens[1], tokens[2]);
		// break;
		// // 保存数据
		// case "save":
		// disk.saveData();
		// break;
		// // 加载数据
		// case "load":
		// disk.loadDate();
		// break;
		// // 退出程序
		// case "exit":
		// System.exit(0);
		// break;
		// default:
		// System.out.println("command not found");
		// break;
		// }
		//
		// }

	}

	/**
	 * 列出所有的文件
	 * 
	 * @param currentDirectory
	 */
	public static void listFile(Directory currentDirectory) {
		System.out.println(currentDirectory.getDirName() + ":");
		ArrayList<DirectoryEntry> tmpEntries = currentDirectory.listFile();
		for (int i = 0; i < tmpEntries.size(); i++) {
			DirectoryEntry entry = tmpEntries.get(i);
			System.out.printf("%6s", entry.getCompleteName());
			System.out.printf("%8s", ByteUtil.byteToBinString(entry.getAttribute()));
			System.out.printf("%6s    ", (entry.getLength() == 0 ? "-"
					: entry.getLength()));
			// 获取文件或目录所占用的盘块
			ArrayList<Byte> list = Disk.getInstance().getFat().getFileAllocateList(entry.getBlockIndex());
			System.out.print("[ ");
			for (int j = 0; j < list.size(); j++) {
				System.out.print(list.get(j) + " ");
			}
			System.out.println("]");
		}
	}

}
